package org.ciallo.simplemusicplayer.adapter;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.color.MaterialColors;
import org.ciallo.simplemusicplayer.R;

import java.util.List;
import java.util.Objects;

/**
 * @author Jukomu
 * @Description: 歌曲更多操作对话框中选项列表的适配器
 * @Package: org.ciallo.simplemusicplayer.adapter
 * @Project: SimpleMusicPlayer
 * @name: SongOptionsAdapter
 * @Date: 2025/5/31-00:46
 * @Filename: SongOptionsAdapter
 */
public class SongOptionsAdapter extends ListAdapter<SongOptionsAdapter.OptionItem, SongOptionsAdapter.OptionViewHolder> {

    // private final List<OptionItem> optionItems; // <--- 移除这个成员变量
    private final OnOptionItemClickListener listener;
    // private Context context; // context 可以从 itemView.getContext() 获取

    /**
     * 代表一个操作选项的数据类。
     */
    public static class OptionItem {
        public final int id;
        public String text;
        public int iconResId;
        public boolean isVisible;
        public boolean isEnabled;

        public OptionItem(int id, String text, int iconResId, boolean isVisible, boolean isEnabled) {
            this.id = id;
            this.text = text;
            this.iconResId = iconResId;
            this.isVisible = isVisible;
            this.isEnabled = isEnabled;
        }
        public void setText(String text) { this.text = text; }
        public void setIconResId(int iconResId){ this.iconResId = iconResId;}
    }

    /**
     * 列表项点击监听器接口。
     */
    public interface OnOptionItemClickListener {
        void onOptionItemClick(OptionItem item);
    }

    /**
     * 构造函数。
     * @param listener    点击事件监听器。
     */
    public SongOptionsAdapter(OnOptionItemClickListener listener) { // <--- 修改构造函数，移除 List<OptionItem>
        super(DIFF_CALLBACK);
        this.listener = listener;
    }

    /**
     * DiffUtil.ItemCallback 用于高效更新列表。
     */
    private static final DiffUtil.ItemCallback<OptionItem> DIFF_CALLBACK = new DiffUtil.ItemCallback<OptionItem>() {
        @Override
        public boolean areItemsTheSame(@NonNull OptionItem oldItem, @NonNull OptionItem newItem) {
            return oldItem.id == newItem.id;
        }

        @Override
        public boolean areContentsTheSame(@NonNull OptionItem oldItem, @NonNull OptionItem newItem) {
            return Objects.equals(oldItem.text, newItem.text) &&
                    oldItem.iconResId == newItem.iconResId &&
                    oldItem.isVisible == newItem.isVisible &&
                    oldItem.isEnabled == newItem.isEnabled;
        }
    };

    @NonNull
    @Override
    public OptionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // this.context = parent.getContext(); // context 可以从 itemView 获取
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_song_option_generic, parent, false);
        return new OptionViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull OptionViewHolder holder, int position) {
        OptionItem item = getItem(position); // <--- 使用 ListAdapter 的 getItem() 方法
        if (item != null) {
            // 根据 isVisible 动态设置 itemView 的可见性和布局参数
            if (item.isVisible) {
                holder.itemView.setVisibility(View.VISIBLE);
                // 确保 itemView 的 LayoutParams 是正确的，以防被 RecyclerView 回收机制影响
                // 这一步通常在 RecyclerView 内部处理，但如果遇到问题可以显式设置
                ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
                if (params != null) { // 仅在 params 不为 null 时修改
                    if (params.height == 0 || params.width == 0) { // 之前被设为不可见
                        params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
                        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
                        holder.itemView.setLayoutParams(params);
                    }
                }
                holder.bind(item, listener);
            } else {
                holder.itemView.setVisibility(View.GONE);
                // 当项不可见时，将其高度和宽度设置为0，这样它就不会在列表中占用空间
                ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
                if (params != null) { // 仅在 params 不为 null 时修改
                    params.height = 0;
                    params.width = 0;
                    holder.itemView.setLayoutParams(params);
                }
            }
        }
    }

    // getItemCount() 由 ListAdapter 自动处理

    /**
     * ViewHolder 类。
     */
    static class OptionViewHolder extends RecyclerView.ViewHolder {
        ImageView ivIcon;
        TextView tvText;

        OptionViewHolder(View itemView) {
            super(itemView);
            ivIcon = itemView.findViewById(R.id.imageView_generic_option_icon);
            tvText = itemView.findViewById(R.id.textView_generic_option_text);
        }

        void bind(final OptionItem item, final OnOptionItemClickListener listener) {
            tvText.setText(item.text);
            itemView.setEnabled(item.isEnabled);
            tvText.setEnabled(item.isEnabled);
            ivIcon.setEnabled(item.isEnabled); // 图标也同步状态

            if (item.iconResId != 0) {
                ivIcon.setVisibility(View.VISIBLE);
                ivIcon.setImageResource(item.iconResId);
                // 使用主题颜色
                ivIcon.setColorFilter(MaterialColors.getColor(itemView.getContext(), com.google.android.material.R.attr.colorOnSurfaceVariant, Color.GRAY));
            } else {
                ivIcon.setVisibility(View.GONE);
            }

            if (item.isEnabled) {
                itemView.setOnClickListener(v -> {
                    if (listener != null) {
                        // 使用 getAdapterPosition() 以确保获取到的是最新的位置，
                        // 尤其是在列表项被添加/删除/移动后。
                        // 但由于我们直接操作 OptionItem 对象，这里 item 已经是正确的对象了。
                        listener.onOptionItemClick(item);
                    }
                });
                itemView.setAlpha(1.0f);
            } else {
                itemView.setOnClickListener(null);
                itemView.setAlpha(0.5f);
            }
        }
    }
}
